// /**
//  * 基本写法和执行 过程, 有点像return 但又可以执行 多次
//  */
// function* createIterator() {
//     console.log(1);
//     yield 2;
//     console.log(3);
//     yield 4;
//     return 5;
// }

// var it = createIterator();
// console.log(it.next());
// // 1
// // { value: 2, done: false }
// console.log(it.next());
// // 3
// // { value: 4, done: false }
// console.log(it.next());
// // { value: 5, done: true }
// console.log(it.next());
// // { value: undefined, done: true }

// /**
//  * 用作函数参数或放在赋值表达式的右边，可以不加括号。
//  */
// function print(e) {
//     console.log(e);
// }
// function* useAsParam() {
//     print(yield 2);
// }
// function* useAssignment() {
//     let value = yield 2;
//     return value
// }


// /**
//  * yeild表达式用在另一个表达式里，需要写括号
//  */
// function* useAsExpression() {
//     // let err = 3 + yield 2;
//     let value = 'hello' + (yield 2);
//     return value;
// }
// let it2 = useAsExpression();
// console.log(it2.next());
// // { value: 2, done: false }
// console.log(it2.next());
// // { value: 'helloundefined', done: true }
// // 上面可以看出(yield 2)是没有返回值的

// /**
//  * 给next函数传参，可以解决上面yield没返回值的问题, 参数会被当作!!上一个!!`yield`表达式的返回值
//  */
// let it3 = useAsExpression();
// console.log(it3.next());
// console.log(it3.next(' world'));

// function* f() {
//     for(var i = 0; true; i++) {
//         var reset = yield i;
//         if(reset) { i = -1; }
//     }
// }

// var g = f();

// g.next() // { value: 0, done: false }
// g.next() // { value: 1, done: false }
// g.next(true) // { value: 0, done: false }

// function* dataConsumer() {
//     console.log('Started');
//     console.log(`1. ${yield}`);
//     console.log(`2. ${yield}`);
//     return 'result';
// }
  
// let genObj = dataConsumer();
// //   genObj.next();
// console.log(genObj.next());

// // Started
// genObj.next('a')
// // 1. a
// genObj.next('b')
//   // 2. b


// /**
//  * for of /.../Array.from/解构赋值 都是遇到done为true就不执行,所以return的都不会被遍历
//  *  */ 
// function* createIterator(){
//     yield 1;
//     yield 2;
//     yield 3;
//     return 4;
// }

// let arr = createIterator();
// for(let i of arr) {
//     console.log(i);
// }

/**
 * 外部抛错，内部捕获
 */

function* forCatchErr(){
    try {
        yield 1;
        yield 2;
        yield 3;
    }catch(e) {
        console.log('内部 Error:', e);
    }
}
let it4 = forCatchErr();
it4.next();
try {
    it4.throw('a');
    it4.throw('b');
    it4.throw('c');
    it4.throw('d');
} catch(e) {
    console.log('外部 Error:', e);
}

